package neptune.web.server.repository;

import it.robertobifulco.ias.RepositoryException;
import neptune.web.server.model.ApplicationUser;

/**
 * Questa interfaccia riassume tutti i metodi necessari ai servizi offerti
 * dall'applicazione.
 * 
 * @author Roberto Bifulco [info@robertobifulco.it, robertobifulco.it]
 * @author Luigi Lorenzo Arpino [luigiarpino@yahoo.it]
 *
 */
public interface ApplicationRepository {

	/**
	 * Aggiunge un utente all'applicazione
	 * 
	 * @param user
	 * @throws RepositoryException
	 */
	public void addUser(ApplicationUser user) throws RepositoryException;

	/**
	 * Rimuove un utente dall'applicazione
	 * 
	 * @param user
	 * @throws RepositoryException
	 */
	public void removeUser(ApplicationUser user) throws RepositoryException;

	/**
	 * Aggiorna le informazioni riguardanti l'utente passato come argomento
	 * 
	 * @param user
	 * @throws RepositoryException
	 */
	public void updateUser(ApplicationUser user) throws RepositoryException;

	/**
	 * Restituisce l'oggetto rappresentativo dell'utente che ha come username
	 * la stringa passata come argomento.
	 * 
	 * @param username
	 * @return
	 * @throws RepositoryException
	 */
	public ApplicationUser getUserByName(String username)
			throws RepositoryException;

	/**
	 * Restituisce gli utenti nell'intervallo compreso fra begin ed end,
	 * ordinati secondo quanto indicato in sortId, in ordine ascendente
	 * se sortAscending e' true.<br><br>
	 * 
	 * Il campo sortId indica rispetto a quale colonna della tabella che 
	 * contiene gli utenti si deve ordinare il risultato. Si parla di 
	 * ordinamento in tabella poiche' questo metodo e' offerto come servizio 
	 * per riportare una lista degli utenti, espressa in forma tabellare,
	 * nell'interfaccia grafica dell'applicazione.
	 * 
	 * 
	 * @param begin
	 * @param end
	 * @param sortId
	 * @param sortAscending
	 * @throws RepositoryException
	 * @return
	 */
	public ApplicationUser[] getUsers(int begin, int end, int sortId,
			boolean sortAscending) throws RepositoryException;

	/**
	 * Elimina l'utente corrispondente al dato username
	 * 
	 * @param username
	 * @return true se l'utente è stato eliminato
	 * @throws RepositoryException
	 */
	public boolean removeUserByName(String username) throws RepositoryException;

	/**
	 * Restituisce il numero di utenti registrati al sistema
	 * 
	 * @return
	 * @throws RepositoryException
	 */
	public int getUsersNumber() throws RepositoryException;

}